package com.heima.utils.common;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;

/**
 * jdk序列化
 */
public class JdkSerializeUtil {

    /**
     * 将指定对象序列化为字节数组
     * @param <T> 序列化对象的类型
     * @param obj 待序列化的对象，不可为null
     * @return 包含序列化数据的字节数组，若序列化失败则返回空数组
     * @throws NullPointerException 当输入对象为null时抛出该异常
     */
    public static <T> byte[] serialize(T obj) {

        /**
         * 空对象检查
         * 序列化操作不允许空对象输入
         */
        if (obj  == null){
            throw new NullPointerException();
        }
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(bos)){
            /**
             * 创建对象输出流并执行序列化操作
             * 将序列化对象写入字节输出流
             */

            oos.writeObject(obj);

            return bos.toByteArray();
        } catch (Exception ex) {
            /**
             * 异常处理模块
             * 打印异常堆栈信息，保留异常现场以便调试
             * 返回空字节数组作为失败标识
             */
            ex.printStackTrace();
        }
        return new byte[0];
    }


    /**
     * 反序列化
     * @param data
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> T deserialize(byte[] data, Class<T> clazz) {


        try (ByteArrayInputStream bis = new ByteArrayInputStream(data);
             ObjectInputStream ois = new ObjectInputStream(bis);){
            T obj = (T)ois.readObject();
            return obj;
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return  null;
    }



}
